﻿using OT.HikiSecureCenterApis.Req;
using OT.HikiSecureCenterApis.Res;
using OT.HikiSecureCenterApis.Service.Resources.Req;
using OT.HikiSecureCenterApis.Service.Resources.Res;

namespace OT.HikiSecureCenterApis.Service.Resources
{
    /// <summary>
    /// 资源目录 --> 人员信息接口
    /// </summary>
    public partial class ResourcesService
    {
        #region 人员卡片接口
        #region 管理接口
        /// <summary>
        /// 批量开卡 /api/cis/v1/card/bindings
        /// 该接口主要是应用于对多个人同时开卡的场景，输入卡片开始有效日期、卡片截止有效日期以及对应的人员、卡片关联列表，
        /// 实现对多个人员同时开卡的功能，开卡成功后，可以到相应子系统开启卡片的权限，例如到门禁子系统开启人员门禁权限。
        /// </summary>
        /// <param name="cardList">必填 待开卡列表,最大支持50张卡，为空返回公共错误码，超过范围返回业务错误码，参考附录E.other.3 卡片错误码
        /// https://open.hikvision.com/docs/5a6616f2134e43d1ba338309a8df2387?curNodeId=5a6616f2134e43d1ba338309a8df2387#b3555ef8
        /// </param>
        /// <param name="startDate">非必填 卡片开始有效时间，时间格式：yyyy-MM-dd</param>
        /// <param name="endDate">非必填 卡片截止有效时间,时间格式：yyyy-MM-dd不能大于2037年12月31日</param>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <returns><see cref="ResCardBind"/></returns>
        public async Task<ResParameter<IList<ResCardBind>>?> CardBindAsync(IList<ReqCardBind> cardList, string startDate, string endDate) =>
          await SecureCenterApis.PostAsync<IList<ResCardBind>>("/api/cis/v1/card/bindings", 1.5, new
          {
              startDate = startDate,
              endDate = endDate,
              cardList = cardList
          });
        /// <summary>
        /// 卡片退卡 /api/cis/v1/card/deletion
        /// 该接口主要是应用于对人员下卡片进行退卡，输入卡号以及所属人员id，实现卡片退卡的功能。退卡成功后，相应子系统的卡片权限清除，例如所属卡片在门禁子系统的门禁权限全部清除。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="cardNumber">必填 卡号，根据获取卡片列表接口获取返回参数cardNo
        /// https://open.hikvision.com/docs/738daa9630df4073a75dd464d0cd4d86?curNodeId=738daa9630df4073a75dd464d0cd4d86#ab775d82
        /// </param>
        /// <param name="personId">必填 人员Id，获取人员列表v2 接口获取返回参数personId
        /// https://open.hikvision.com/docs/901f1b628040407fb32c79907d8026cc?curNodeId=901f1b628040407fb32c79907d8026cc#aa136eca
        /// </param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> CardDelAsync(string cardNumber, string personId) =>
          await SecureCenterApis.PostAsync<object>("/api/cis/v1/card/deletion", 1.2, new { cardNumber = cardNumber, personId = personId });
        /// <summary>
        /// 批量挂失 /api/cis/v1/card/batch/loss
        /// 用于卡片批量挂失，批量挂失数量不能超过200个。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="reqs">人卡关联结合数组(批量挂失数量不能超过200个)</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> CardLossAsync(IList<ReqCardLoss> reqs) =>
          await SecureCenterApis.PostAsync<object>("/api/cis/v1/card/batch/loss", 1.4, new { cardList = reqs });
        /// <summary>
        /// 批量解挂 /api/cis/v1/card/batch/unLoss
        /// 用于卡片批量解挂，批量解挂数量不能超过200个
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="reqs">人卡关联结合数组(批量挂失数量不能超过200个)</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> CardUnLossAsync(IList<ReqCardLoss> reqs) =>
          await SecureCenterApis.PostAsync<object>("/api/cis/v1/card/batch/unLoss", 1.4, new { cardList = reqs });
        /// <summary>
        /// 生成卡片二维码 /api/cis/v1/card/barCode
        /// 用于生产卡片二维码，二维码默认有效期为24*60分钟，默认最大开锁次数4次.
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="personId">非必填 人员ID，cardNo存在的情况下 人员ID可不填，根据获取人员列表v2接口获取返回参数personId
        /// https://open.hikvision.com/docs/901f1b628040407fb32c79907d8026cc?curNodeId=901f1b628040407fb32c79907d8026cc#aa136eca
        /// </param>
        /// <param name="cardNo">非必填 卡号</param>
        /// <param name="certType">非必填 证件类型，当人员唯一标示是证件类型+证件号码时必填，111:身份证,414:护照,113:户口簿,335:驾驶证,131:工作证,133:学生证,990:其他</param>
        /// <param name="certNum">非必填 证件号码，当人员唯一标示是证件类型+证件号码时必填，根据获取人员列表v2接口获取返回参数certificateNo
        /// https://open.hikvision.com/docs/901f1b628040407fb32c79907d8026cc?curNodeId=901f1b628040407fb32c79907d8026cc#aa136eca
        /// </param>
        /// <param name="phone">非必填 手机号码，当人员唯一标示是手机号码时必填根据获取人员列表v2接口获取返回参数phoneNo
        /// https://open.hikvision.com/docs/901f1b628040407fb32c79907d8026cc?curNodeId=901f1b628040407fb32c79907d8026cc#aa136eca
        /// </param>
        /// <param name="employeeId">非必填 职工号，当人员唯一标示是工号时必填，根据获取人员列表v2接口获取返回参数jobNo
        /// https://open.hikvision.com/docs/901f1b628040407fb32c79907d8026cc?curNodeId=901f1b628040407fb32c79907d8026cc#aa136eca
        /// </param>
        /// <param name="duration">非必填 人员卡片二维码有效期时长，非必填字段，单位为分钟，范围为[5~7*24*60]分钟，不传默认为24*60分钟</param>
        /// <param name="maxLock">非必填 最大开锁次数，其中针对同一台设备最大开锁次数不超过指定的次数，不传默认最大开锁次数为4次</param>
        /// <returns><see cref="ResCardBarCode"/></returns>
        public async Task<ResParameter<ResCardBarCode>?> CardBarCodeAsync(string personId = null, string cardNo = null, int certType = 111, string certNum = null,
            string phone = null, string employeeId = null, int duration = 1440, int maxLock = 4) =>
          await SecureCenterApis.PostAsync<ResCardBarCode>("/api/cis/v1/card/barCode", 1.4, new
          {
              personId = personId,
              cardNo = cardNo,
              certType = certType,
              certNum = certNum,
              phone = phone,
              employeeId = employeeId,
              duration = duration,
              maxLock = maxLock
          });
        #endregion

        #region 查询接口
        /// <summary>
        /// 获取卡片列表 /api/resource/v1/card/cardList
        /// 获取卡片列表接口可用来全量同步卡片信息，返回结果分页展示，不作权限过滤。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.0及以上版本</remarks>
        /// <param name="page">必填 页面，页大小</param>
        /// <returns><see cref="ResCardBind"/></returns>
        public async Task<ResParameter<ResPageData<ResCardBind>>?> CardListAsync(ReqPage page) =>
          await SecureCenterApis.PostAsync<ResPageData<ResCardBind>>("/api/resource/v1/card/cardList", 1.0, page);
        /// <summary>
        /// 获取单个卡片信息 /api/irds/v1/card/cardInfo
        /// 获取卡片列表接口可用来全量同步卡片信息，返回结果分页展示，不作权限过滤。
        /// 注：卡号为精确查找
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="cardNo">非必填 卡片号码，卡片号码和卡片ID两者同时只能传一种参数获取卡片列表接口获取返回参数cardNo
        /// https://open.hikvision.com/docs/738daa9630df4073a75dd464d0cd4d86?curNodeId=738daa9630df4073a75dd464d0cd4d86#ab775d82
        /// </param>
        /// <param name="cardId">非必填 卡号ID，卡片号码和卡片ID两者同时只能传一种参数获取卡片列表接口获取返回参数cardId
        /// https://open.hikvision.com/docs/738daa9630df4073a75dd464d0cd4d86?curNodeId=738daa9630df4073a75dd464d0cd4d86#ab775d82
        /// </param>
        /// <returns><see cref="ResCardBind"/></returns>
        public async Task<ResParameter<ResCardBind>?> CardInfoAsync(string cardNo, string cardId) =>
          await SecureCenterApis.PostAsync<ResCardBind>("/api/irds/v1/card/cardInfo", 1.2, new
          {
              cardNo = cardNo,
              cardId = cardId
          });
        /// <summary>
        /// 查询卡片列表 /api/irds/v1/card/advance/cardList
        /// 查询卡片列表接口可以根据卡片号码、人员姓名、卡片状态、人员ID集合等查询条件来进行高级查询；若不指定查询条件，即全量获取所有的卡片信息。返回结果分页展示。
        /// 注：若指定多个查询条件，表示将这些查询条件进行“与”的组合后进行查询。
        /// “人员名称personName”条件查询为模糊查询。
        /// “卡片号码cardNo”条件查询为模糊查询。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResCardBind"/></returns>
        public async Task<ResParameter<ResPageData<ResCardBind>>?> CardListSearchAsync(ReqCardSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResCardBind>>("/api/irds/v1/card/advance/cardList", 1.4, req);
        /// <summary>
        /// 获取根区域信息 /api/resource/v1/card/timeRange
        /// 获取根区域信息
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <returns><see cref="ResCardBind"/></returns>
        public async Task<ResParameter<ResPageData<ResCardBind>>?> CardTimeRangeAsync(ReqPageDate req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResCardBind>>("/api/resource/v1/card/timeRange", 1.4, req);
        #endregion
        #endregion

        #region 组织信息接口
        #region 组织管理接口
        /// <summary>
        /// 修改组织 /api/resource/v1/org/single/update
        /// 根据组织编号修改组织信息。其它扩展属性按照定义以 key：value 上传即可，根据获取资源属性接口查询平台已配置的资源属性
        /// https://open.hikvision.com/docs/901f1b628040407fb32c79907d8026cc?curNodeId=901f1b628040407fb32c79907d8026cc#de003a88
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="orgIndexCode">必填 组织标识，必须保证已存在，从获取组织列表 接口获取返回参数orgIndexCode。
        /// https://open.hikvision.com/docs/480226390e5149a2b5d45d1e0e022fd4?curNodeId=480226390e5149a2b5d45d1e0e022fd4#b8da83b5
        /// </param>
        /// <param name="orgName">非必填 组织名称，1~32个字符；不能包含 ’ / \ : * ? " < ></param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> OrgUpdateAsync(string orgIndexCode, string orgName) =>
          await SecureCenterApis.PostAsync<object>("/api/resource/v1/org/single/update", 1.3);
        /// <summary>
        /// 批量删除组织 /api/resource/v1/org/batch/delete
        /// 仅支持删除无子结点且组织下不存在人员的组织。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="indexCodes">必填 仅支持删除无子结点且组织下不存在人员的组织。</param>
        /// <returns><see cref="ResOrgDel"/></returns>
        public async Task<ResParameter<IList<ResOrgDel>>?> OrgDelAsync(IList<string> indexCodes) =>
          await SecureCenterApis.PostAsync<IList<ResOrgDel>>("/api/resource/v1/org/batch/delete", 1.3, new { indexCodes = indexCodes });
        /// <summary>
        /// 批量添加组织 /api/resource/v1/org/batch/add
        /// 支持三方指定组织唯一标识， 也支持ISC独立生成组织唯一标识。
        /// 其它扩展属性按照定义以 key：value 上传即可，根据获取资源属性接口查询平台已配置的资源属性
        /// https://open.hikvision.com/docs/901f1b628040407fb32c79907d8026cc?curNodeId=901f1b628040407fb32c79907d8026cc#de003a88
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <returns><see cref="ResRoot"/></returns>
        public async Task<ResParameter<ResAdd>?> OrgAddAsync(IList<ReqOrg> reqs) =>
          await SecureCenterApis.PostAsync<ResAdd>("/api/resource/v1/org/batch/add", 1.3, reqs);
        #endregion

        #region 组织查询接口
        /// <summary>
        /// 获取根组织 /api/resource/v1/org/rootOrg
        /// 获取根组织接口用来获取组织的根节点。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.0及以上版本</remarks>
        /// <returns><see cref="ResOrg"/></returns>
        public async Task<ResParameter<ResOrg>?> OrgRootAsync() =>
          await SecureCenterApis.PostAsync<ResOrg>("/api/resource/v1/org/rootOrg", 1.0);
        /// <summary>
        /// 获取组织列表 /api/resource/v1/org/orgList
        /// 根据该接口全量同步组织信息,不作权限过滤，返回结果分页展示。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.0及以上版本</remarks>
        /// <param name="page">必填，页码，页大小</param>
        /// <returns><see cref="ResOrg"/></returns>
        public async Task<ResParameter<ResPageData<ResOrg>>?> OrgListAsync(ReqPage page) =>
          await SecureCenterApis.PostAsync<ResPageData<ResOrg>>("/api/resource/v1/org/orgList", 1.0, page);
        /// <summary>
        /// 查询组织列表v2 /api/resource/v2/org/advance/orgList
        /// 根据不同的组织属性分页查询组织信息。
        /// 查询组织列表接口可以根据组织唯一标识集、组织名称、组织状态等查询条件来进行高级查询。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResOrg"/></returns>
        public async Task<ResParameter<ResPageData<ResOrg>>?> AdvanceOrgListAsync(ReqOrgSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResOrg>>("/api/resource/v2/org/advance/orgList", 1.4, req);
        /// <summary>
        /// 根据父组织编号获取下级组织列表 /api/resource/v1/org/parentOrgIndexCode/subOrgList
        /// 根据父组织编号获取下级组织列表，主要用于逐层获取父组织的下级组织信息，返回结果分页展示。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.0及以上版本</remarks>
        /// <param name="parentOrgIndexCode">必填 父组织编号 从获取组织列表 接口获取返回参数orgIndexCode
        /// https://open.hikvision.com/docs/480226390e5149a2b5d45d1e0e022fd4?curNodeId=480226390e5149a2b5d45d1e0e022fd4#b8da83b5
        /// </param>
        /// <param name="page">必填，页码，页大小</param>
        /// <returns><see cref="ResOrg"/></returns>
        public async Task<ResParameter<ResPageData<ResOrg>>?> SubOrgListAsync(string parentOrgIndexCode, ReqPage page) =>
          await SecureCenterApis.PostAsync<ResPageData<ResOrg>>("/api/resource/v1/org/parentOrgIndexCode/subOrgList", 1.0, new
          {
              parentOrgIndexCode = parentOrgIndexCode,
              pageNo = page?.pageNo ?? 1,
              pageSize = page?.pageSize ?? 10,
          });
        /// <summary>
        /// 增量获取组织数据 /api/resource/v1/org/timeRange
        /// 根据查询条件查询组织列表信息，主要根据时间段分页获取组织数据，包含已删除数据。其中开始日期与结束日期的时间差必须在1-48小时内。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="page">必填，页码，页大小,开始时间，结束时间</param>
        /// <returns><see cref="ResOrg"/></returns>
        public async Task<ResParameter<ResPageData<ResOrg>>?> OrgTimeRangeAsync(ReqPageDate page) =>
          await SecureCenterApis.PostAsync<ResPageData<ResOrg>>("/api/resource/v1/org/timeRange", 1.4, page);
        /// <summary>
        /// 根据组织编号获取组织详细信息 /api/resource/v1/org/orgIndexCodes/orgInfo
        /// 根据组织编号orgIndexCode列表获取指定的组织信息，如存在多组织则返回总条数及多组织信息
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="orgIndexCodes">必填 组织编号数组,从获取组织列表接口获取返回参数orgIndexCode，最大1000个</param>
        /// <returns><see cref="ResOrg"/></returns>
        public async Task<ResParameter<ResPageData<ResOrg>>?> OrgInfoAsync(IList<string> orgIndexCodes) =>
          await SecureCenterApis.PostAsync<ResPageData<ResOrg>>("/api/resource/v1/org/orgIndexCodes/orgInfo", 1.4, new { orgIndexCodes = orgIndexCodes });
        #endregion
        #endregion

        #region 人员及照片接口
        /// <summary>
        /// 获取资源属性 /api/resource/v1/resource/properties
        /// 查询当前平台指定资源已定义的属性信息集合， 适用于平台资源自定义属性的场景， 部分接口需要使用这部分自定义属性。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="resourceType">必填，资源类型，当前版本支持 person: 人员，region：区域，vehicle：车辆，organization：组织</param>
        /// <returns><see cref="ResProperties"/></returns>
        public async Task<ResParameter<IList<ResProperties>>?> ResourcePropertiesAsync(string resourceType) =>
          await SecureCenterApis.PostAsync<IList<ResProperties>>("/api/resource/v1/resource/properties", 1.3, new { resourceType = resourceType });
        #region 管理接口
        /// <summary>
        /// 添加人员v2 /api/resource/v2/person/single/add
        /// 添加人员信息接口，注意，在安保基础数据配置的必选字段必须都包括在入参中。
        /// 人员添加的时候，可以指定人员personId，不允许与其他人员personId重复，包括已删除的人员。
        /// 本接口支持人员信息的扩展字段，按照属性定义key:value上传即可， 可通过获取资源属性接口，获取平台已启用的人员属性信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="personName">必填 人员名称，1~32个字符；不能包含 ’ / \ : * ? " < ></param>
        /// <param name="gender">必填 性别，1：男；2：女；0：未知</param>
        /// <param name="orgIndexCode">必填 所属组织标识，必须是已存在组织，从获取组织列表接口获取返回参数orgIndexCode</param>
        /// <param name="personId">非必填 人员ID，可以指定人员personId，不允许与其他人员personId重复，包括已删除的人员。 为空时平台自动生成人员ID</param>
        /// <param name="birthday">非必填 出生日期，举例：1992-09-12</param>
        /// <param name="phoneNo">非必填 手机号，1-20位数字,平台上人员信息实名标识选择为手机号码时必填</param>
        /// <param name="email">非必填 邮箱，举例：hic@163.com</param>
        /// <param name="certificateType">非必填 证件类型，参考附录A 数据字典，平台上人员信息实名标识选择为身份证件时必填
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95?curNodeId=0f6e8e1e41a14304aeecd287530b9c95#a0582e39
        /// 111	身份证 414	护照 113	户口簿 335	驾驶证 131	工作证 133	学生证 990	其他
        /// </param>
        /// <param name="certificateNo">非必填 证件号码，1-20位数字字母，平台上人员信息实名标识选择为身份证件时必填</param>
        /// <param name="jobNo">非必填 工号，1-32个字符，平台上人员信息实名标识选择为工号时必填</param>
        /// <param name="faces">非必填 人脸信息</param>
        /// <returns><see cref="ResPersonAdd"/></returns>
        public async Task<ResParameter<ResPersonAdd>?> PersonAddAsync(string personName, string gender, string orgIndexCode, string personId = null, string birthday = null,
            string phoneNo = null, string email = null, string certificateType = null, string certificateNo = null, string jobNo = null, IList<string> faces = null) =>
          await SecureCenterApis.PostAsync<ResPersonAdd>("/api/resource/v2/person/single/add", 1.5, new
          {
              personName = personName,
              gender = gender,
              orgIndexCode = orgIndexCode,
              personId = personId,
              birthday = birthday,
              phoneNo = phoneNo,
              email = email,
              certificateType = certificateType,
              certificateNo = certificateNo,
              jobNo = jobNo,
              faces = faces?.Select(o => new { faceData = o }).ToList()
          });
        /// <summary>
        /// 批量添加人员 /api/resource/v1/person/batch/add
        /// 添加人员信息接口，注意，在安保基础数据配置的必选字段必须都包括在入参中。
        /// 批量添加仅支持人员基础属性。
        /// 人员批量添加的时候，可以指定人员personId，不允许与其他人员personId重复，包括已删除的人员。
        /// 如果用户不想指定personId，那么需要指定clientId，请求内的每一条数据的clientid必须唯一， 返回值会将平台生成的personid与clientid做绑定。
        /// 若personId和clientId都不指定，则无法准确判断哪部分人员添加成功。
        /// 本接口支持人员信息的扩展字段，按照属性定义key:value上传即可， 可通过获取资源属性接口，获取平台已启用的人员属性信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="reqs">人员列表</param>
        /// <returns><see cref="ResAdd"/></returns>
        public async Task<ResParameter<ResAdd>?> PersonAddAsync(IList<ReqPerson> reqs) =>
          await SecureCenterApis.PostAsync<ResAdd>("/api/resource/v1/person/batch/add", 1.3, reqs);
        /// <summary>
        /// 修改人员 /api/resource/v1/person/single/update
        /// 根据人员编号修改人员信息。
        /// 本接口支持人员信息的扩展字段，按照属性定义key:value上传即可， 可通过获取资源属性接口，获取平台已启用的人员属性信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="personId">非必填 人员ID，可以指定人员personId，不允许与其他人员personId重复，包括已删除的人员。 为空时平台自动生成人员ID</param>
        /// <param name="personName">非必填 人员名称，1~32个字符；不能包含 ’ / \ : * ? " < ></param>
        /// <param name="gender">非必填 性别，1：男；2：女；0：未知</param>
        /// <param name="orgIndexCode">非必填 所属组织标识，必须是已存在组织，从获取组织列表接口获取返回参数orgIndexCode</param>
        /// <param name="birthday">非必填 出生日期，举例：1992-09-12</param>
        /// <param name="phoneNo">非必填 手机号，1-20位数字,平台上人员信息实名标识选择为手机号码时必填</param>
        /// <param name="email">非必填 邮箱，举例：hic@163.com</param>
        /// <param name="certificateType">非必填 证件类型，参考附录A 数据字典，平台上人员信息实名标识选择为身份证件时必填
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95?curNodeId=0f6e8e1e41a14304aeecd287530b9c95#a0582e39
        /// 111	身份证 414	护照 113	户口簿 335	驾驶证 131	工作证 133	学生证 990	其他
        /// </param>
        /// <param name="certificateNo">非必填 证件号码，1-20位数字字母，平台上人员信息实名标识选择为身份证件时必填</param>
        /// <param name="jobNo">非必填 工号，1-32个字符，平台上人员信息实名标识选择为工号时必填</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> PersonUpdateAsync(string personId, string personName = null, string gender = null, string orgIndexCode = null, string birthday = null,
            string phoneNo = null, string email = null, string certificateType = null, string certificateNo = null, string jobNo = null) =>
          await SecureCenterApis.PostAsync<object>("/api/resource/v1/person/single/update", 1.3, new
          {
              personName = personName,
              gender = gender,
              orgIndexCode = orgIndexCode,
              personId = personId,
              birthday = birthday,
              phoneNo = phoneNo,
              email = email,
              certificateType = certificateType,
              certificateNo = certificateNo,
              jobNo = jobNo
          });
        /// <summary>
        /// 批量删除人员 /api/resource/v1/person/batch/delete
        /// 根据编号删除人员，人员删除是软删除，可以在安保基础数据查询已删除人员。支持批量删除人员。删除人员将会同时删除人员关联的指纹和人脸信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="personIds">必填 人员Id，单次操作上限为1000条。获取人员列表v2 接口获取返回参数personId</param>
        /// <returns><see cref="ResRoot"/></returns>
        public async Task<ResParameter<IList<ResPersonDel>>?> PersonDelAsync(IList<string> personIds) =>
          await SecureCenterApis.PostAsync<IList<ResPersonDel>>("/api/resource/v1/person/batch/delete", 1.3, new { personIds = personIds });
        /// <summary>
        /// 添加人脸 /api/resource/v1/face/single/add
        /// 添加人脸信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="personId">必填 人员Id</param>
        /// <param name="faceData">必填 人脸图片base64编码后的字符数据</param>
        /// <returns><see cref="ResPersonAdd"/></returns>
        public async Task<ResParameter<ResPersonAdd>?> FaceAddAsync(string personId, string faceData) =>
          await SecureCenterApis.PostAsync<ResPersonAdd>("/api/resource/v1/face/single/add", 1.3, new { personId = personId, faceData = faceData });
        /// <summary>
        /// 修改人脸 /api/resource/v1/face/single/update
        /// 根据人脸Id修改人脸。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="personId">必填 人员Id</param>
        /// <param name="faceData">必填 人脸图片base64编码后的字符数据</param>
        /// <returns><see cref="ResPersonAdd"/></returns>
        public async Task<ResParameter<ResPersonAdd>?> FaceUpdateAsync(string personId, string faceData) =>
          await SecureCenterApis.PostAsync<ResPersonAdd>("/api/resource/v1/face/single/update", 1.3);
        /// <summary>
        /// 删除人脸 /api/resource/v1/face/single/delete
        /// 根据人脸Id删除人脸。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="faceId">必填 人脸图片Id 添加人脸 接口返回报文中的faceId字段，或获取人员列表v2 接口返回报文中的personPhotoIndexCode字段</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> FaceDelAsync(string faceId) =>
          await SecureCenterApis.PostAsync<object>("/api/resource/v1/face/single/delete", 1.3, new { faceId = faceId });
        #endregion

        #region 查询接口
        /// <summary>
        /// 获取组织下人员列表v2 /api/resource/v2/person/orgIndexCode/personList
        /// 根据组织编号获取组织下的人员信息列表，返回结果分页展示。
        /// 本接口支持自定义属性的返回， 通过获取资源属性接口获取平台已支持人员属性的说明。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="orgIndexCode">必填，组织唯一标识码， 获取组织列表 接口获取</param>
        /// <param name="page">必填，页码，页大小</param>
        /// <returns><see cref="ResPerson"/></returns>
        public async Task<ResParameter<ResPerson>?> PersonListAsync(string orgIndexCode, ReqPage page) =>
          await SecureCenterApis.PostAsync<ResPerson>("/api/resource/v2/person/orgIndexCode/personList", 1.3, new
          {
              orgIndexCode = orgIndexCode,
              pageNo = page?.pageNo ?? 1,
              pageSize = page?.pageSize ?? 10,
          });
        /// <summary>
        /// 获取人员列表v2 /api/resource/v2/person/personList
        /// 获取人员列表接口可用来全量同步人员信息，返回结果分页展示。
        /// 本接口支持自定义属性的返回， 通过获取资源属性接口获取平台已支持人员属性的说明。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="page">必填，页码，页大小</param>
        /// <returns><see cref="ResPerson"/></returns>
        public async Task<ResParameter<ResPageData<ResPerson>>?> PersonListAsync(ReqPage page) =>
          await SecureCenterApis.PostAsync<ResPageData<ResPerson>>("/api/resource/v2/person/personList", 1.3, page);
        /// <summary>
        /// 查询人员列表v2 /api/resource/v2/person/advance/personList
        /// 查询人员列表接口可以根据人员ID集、人员姓名、人员性别、所属组织、证件类型、证件号码、人员状态这些查询条件来进行高级查询；若不指定查询条件，即全量获取所有的人员信息。返回结果分页展示。
        /// 注：若指定多个查询条件，表示将这些查询条件进行”与”的组合后进行精确查询。
        /// 根据”人员名称personName”查询为模糊查询。
        /// 本接口支持自定义属性的返回，及自定义属性进行查找， 通过获取资源属性接口获取平台已支持人员属性的说明。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <returns><see cref="ResRoot"/></returns>
        public async Task<ResParameter<ResPageData<ResPerson>>?> AdvancePersonListAsync(ReqPersonSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResPerson>>("/api/resource/v2/person/advance/personList", 1.3, req);
        /// <summary>
        /// 根据人员唯一字段获取人员详细信息 /api/resource/v1/person/condition/personInfo
        /// 获取人员信息接口，可以根据实名标识(证件号码、人员ID、手机号码、工号)来精确查询人员信息，并返回总数量。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="paramName">必填,参数名
        /// certificateNo：证件号码，从获取人员列表v2接口返回报文中的certificateNo字段
        /// personId：人员Id，从获取人员列表v2接口返回报文中的personId字段；
        /// phoneNo：手机号码，从获取人员列表v2接口返回报文中的phoneNo字段；
        /// jobNo：工号，从获取人员列表v2接口返回报文中的jobNo字段。</param>
        /// <param name="paramValue">根据入参传对应的值，最大1000个</param>
        /// <returns><see cref="ResPerson"/></returns>
        public async Task<ResParameter<ResPageData<ResPerson>>?> PersonInfoAsync(string paramName, IList<string> paramValue) =>
          await SecureCenterApis.PostAsync<ResPageData<ResPerson>>("/api/resource/v1/person/condition/personInfo", 1.4, new
          {
              paramName = paramName,
              paramValue = paramValue
          });
        /// <summary>
        /// 增量获取人员数据 /api/resource/v1/person/personList/timeRange
        /// 根据查询条件查询人员列表信息，主要用于根据时间段分页获取人员信息，包含已删除数据。其中开始日期与结束日期的时间差必须在48小时内。返回信息中只有基础数据，没有人员照片信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="page">必填，页码，页大小，开始时间，结束时间</param>
        /// <returns><see cref="ResPerson"/></returns>
        public async Task<ResParameter<ResPageData<ResPerson>>?> PersonTimeRangeync(ReqPageDate page) =>
          await SecureCenterApis.PostAsync<ResPageData<ResPerson>>("/api/resource/v1/person/personList/timeRange", 1.4, page);
        /// <summary>
        /// 提取人员图片 /api/resource/v1/person/picture
        /// 根据获取人员信息的接口中拿到的图片URI和图片服务器唯一标识，通过该接口得到完整的URL，可以直接从图片服务下载图；此接口返回重定向请求redirect：picUrl
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.0及以上版本</remarks>
        /// <param name="picUri">必填 图片相对URI 通过获取人员列表v2接口返回“picUri”字段</param>
        /// <param name="serverIndexCode">必填 图片服务器唯一标识 通过获取人员列表v2接口返回“serverIndexCode”字段</param>
        /// <returns><see cref="ResParameter{T}"/>重定向后返回图片流，图片的重定向地址在header中的Location可以获取到。</returns>
        public async Task<ResParameter<object>?> PersonPicturesync(string picUri, string serverIndexCode) =>
          await SecureCenterApis.PostAsync<object>("/api/resource/v1/person/picture", 1.0, new { picUri = picUri, serverIndexCode = serverIndexCode });
        #endregion
        #endregion
    }
}
